package com.ticket.sass.admin.validator;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.Arrays;

/**
 * @author ywb
 * @date 2022-05-27 10:55
 */
public class InEnumValidator implements ConstraintValidator<InEnum, Object> {
    private String[] strValues;
    private int[] intValues;

    @Override
    public void initialize(InEnum constraintAnnotation) {
        strValues = constraintAnnotation.strValues();
        intValues = constraintAnnotation.intValues();
    }
    
    @Override
    public boolean isValid(Object value, ConstraintValidatorContext context) {
        String message = "";
        if (value == null) {
            return true;
        } else if (value instanceof String) {
            message = context.getDefaultConstraintMessageTemplate().replaceAll("\\{value}", Arrays.toString(strValues));
            for (String s : strValues) {
                if (s.equals(value)) {
                    return true;
                }
            }
        } else if (value instanceof Integer) {
            message = context.getDefaultConstraintMessageTemplate().replaceAll("\\{value}", Arrays.toString(intValues));
            for (int s : intValues) {
                if (s == (Integer) value) {
                    return true;
                }
            }
        } else if (value instanceof Short){
            message = context.getDefaultConstraintMessageTemplate().replaceAll("\\{value}", Arrays.toString(intValues));
            int shortValue = ((Short) value).intValue(); // 将Short类型转换为int
            for (int s : intValues) {
                if (s == shortValue) {
                    return true;
                }
            }
        }
        
        // 校验不通过，自定义提示语句（因为，注解上的 value 是枚举类，无法获得枚举类的实际值）
        context.disableDefaultConstraintViolation(); // 禁用默认的 message 的值
        context.buildConstraintViolationWithTemplate(
            message
        ).addConstraintViolation(); // 重新添加错误提示语句
        return false;
    }
}
